/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package InteracciónBD;

import java.sql.*;
import static Utilidades.Constantes.*;

/**
 * Clase que permite la gestión de una conexión a un servidor.
 * @author Felipe Rachid - Javier Pérez
 */
public class Conection
{
    private Connection bdConnection;     
    private Statement bdStatement;
    private ResultSet bdResultSet;
    private ResultSetMetaData resultSetMD;
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    
    /**
     * @return bdConection Conexión para iniciar sesión en una BBDD.
     */
    private Connection getBdConnection()
    { return bdConnection; }

    /**
     * @param bdConection Conexión para iniciar sesión en una BBDD.
     */
    private void setBdConnection(Connection bdConnection)
    { this.bdConnection = bdConnection; }

    /**
     * @return bdStatement Declarador de sentencias SQL.
     */
    private Statement getBdStatement()
    { return bdStatement; }

    /**
     * @param bdStatement Declarador de sentencias SQL.
     */
    private void setBdStatement(Statement bdStatement)
    { this.bdStatement = bdStatement; }

    /**
     * @return bdResultSet Tabla de resultados generados por el Statement.
     */
    private ResultSet getBdResultSet()
    { return bdResultSet; }

    /**
     * @param bdResultSet Tabla de resultados generados por el Statement.
     */
    private void setBdResultSet(ResultSet bdResultSet)
    { this.bdResultSet = bdResultSet; }
    
    /**
     * @return resultSetMD Usado para obtener información sobre tipos 
     * y porpiedades de las columnas obtenidos en el resultSet.
     */
    public ResultSetMetaData getResultSetMD()
    { return resultSetMD; }

    /**
     * @param resultSetMD Usado para obtener información sobre tipos 
     * y porpiedades de las columnas obtenidos en el resultSet.
     */
    public void setResultSetMD(ResultSetMetaData resultSetMD)
    { this.resultSetMD = resultSetMD; }
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    
    /**
     * Constructor de la clase Conection que registra el driver necesario para gestionar conexiones.
     */
    public Conection()
    {
        try { DriverManager.registerDriver(new org.gjt.mm.mysql.Driver()); }
        catch (Exception e) {System.err.println(e.toString());}
    }
    
    /**
     * Obtiene, coloca y utiliza la información necesaria para abrir una conexion.
     * @param name Nombre de la conexión.
     * @param location Ruta de la conexión.
     * @param user Nombre del usuario.
     * @param pass Contraseña del usuario.
     */
    public void openConnection(String location, String user, String pass)
    {
        try{ setBdConnection(DriverManager.getConnection(location, user, pass)); }
        catch (Exception e) { System.err.println(e.toString()); }
    }
    
    /**
     * Cierra una conexión abierta.
     */
    public void closeConcection()
    {
        try { getBdConnection().close(); }
        catch(Exception e) {System.err.println(e.toString());}
    }
    
    /**
     * Obtiene el Result Set generado por un Statement sobre una conexión abierta.
     * @param query Cconsulta SQL.
     * @return bdResultSet Result Set encapsulado.
     */
    public ResultSet obtainResultSet(String query)
    {
        try
        {
            this.setBdStatement((getBdConnection()).createStatement());
            this.setBdResultSet(getBdStatement().executeQuery(query));
        }
        catch (Exception e) { System.err.println(e.toString()); }
        return getBdResultSet();
    }
    
    /*
     * Imprime el resultado de la consulta.
     */
    public void printResultSet()
    {
        try
        {  
            setResultSetMD(getBdResultSet().getMetaData());
            int nColumn = getResultSetMD().getColumnCount();
            String field;
            for (int i = 1; i <= nColumn; i++)
            {
                field = getResultSetMD().getColumnName(i);
                if (field.contains("Precio/1.312")) field = "Precio";
                while(field.length() < LONG_CAMPO) field = field + " ";
                System.out.print(field);
            }
            System.out.println();
            while (getBdResultSet().next())
            { 
                for (int i = 1; i <= nColumn; i++)
                {
                    field = getBdResultSet().getString (i);
                    while(field.length() < LONG_CAMPO) field = field + " ";
                    System.out.print(field);
                }  
                System.out.println();
            }
        }
        catch (Exception e) { System.err.println(e.toString()); }
    }
}